约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,其顺序是:5,4,6,2,3,1。
此为小程序多文件的写法,有 joseph.c joseph.h main.c makefile 四个文件。
- joseph.c
#include <stdio.h>
#include <stdlib.h>
#include "joseph.h"
joseph *joseph_insert(int num)
{
joseph *l = NULL;
joseph *p = NULL;
joseph *new = NULL;
int i = 1;
l = malloc(sizeof(joseph));
l->id = i;
p = l;
sprintf(l->id, "%d", i);
for(i = 1; i <=10 ; i++) {
new = malloc(sizeof(LLIST));
new->id = i;
sprintf(new->id, "%d", i);
new->next = l;
p->next = new;
p = new;
}
return l;
}
void joseph_display(joseph *l)
{
joseph *p;
for(p = l; p != l; p = p->next)
printf("%d\n", p->id);
}
int joseph_play(joseph *p, int i , int j)
{
joseph *p = l;
LLIST *p = NULL;
// p = _find(*l, find_data);
for(i = 1; i < 4; i++) {
while(i == 3) {
}
}
for(p = l; p != l; p = p->next) {
if(p->id == );
return p;
}
if(p == NULL)
return -1;
if(p == *l) {
*l = (*l)->next;
free(p);
}
else {
while(back->next != p)
back = back->next;
back->next = p->next;
free(p);
}
printf("Bingo! l->id = %d\n",i);
return 0;
}
- joseph.h
#ifndef __JOSEPH_H
#define __JOSEPH_H
typedef struct llist
{
int id;
struct llist *next;
} joseph;
joseph *joseph_insert(int);
void joseph_display(joseph *);
int joseph_play(joseph *, int , int);
#endif
- main.c
#include <stdio.h>
#include "joseph.h"
int main(void)
{
joseph *l = NULL;
int peo_num = 0;
int kill_num = 0;
int alive = 0;
printf("Please Insert People Number : ");
scanf("%d", &peo_num);
l = joseph_insert(peo_num);//插入
printf("=======================================\n");
joseph_display(l);//遍历
printf("=======================================\n");
printf("Please Insert Kill Number : ");
scanf("%d", &kill_num);
alive = joseph_play(l, peo_num, kill_num);//玩游戏
printf("=======================================\n");
printf("Alive : %d\n", alive);
return 0;
}
- makefile
main : main.o joseph.o
gcc -o $@ $^
clean :
rm -rf *.o main